/*
 * Licensed to the Tai Ping Jin Ke
 *
 * Copyright (c) 2022 .
 * All rights reserved.
 * 项目名称：太平金科-基础组件封装层-SpringBoot组件封装-核心依赖
 * 版权说明：本软件属太平金融科技服务(上海)有限公司所有，在未获得太平金融科技服务(上海)有限公司正式授权情况下，任何企业和个人，不能获取、阅读、安装、传播本软件涉及的任何受知识产权保护的内容。
 */
package com.taipingframework.boot.web.security;

import com.google.common.base.Charsets;
import com.taipingframework.boot.web.properties.SecurityProperty;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.util.DigestUtils;

public class SecretHandler {

    /**
     * 执行数据加密的属性配置
     */
    private static SecurityProperty securityProperty;

    public SecretHandler(SecurityProperty securityProperty) {
        SecretHandler.securityProperty = securityProperty;
    }

    /**
     * Calculates the MD5 digest and returns the value as a 32 character hex string.
     *
     * @param data Data to digest
     * @return MD5 digest as a hex string
     */
    public static String md5Hex(final String data) {
        return DigestUtils.md5DigestAsHex(data.getBytes(Charsets.UTF_8));
    }

    /**
     * Return a hexadecimal string representation of the MD5 digest of the given bytes.
     *
     * @param bytes the bytes to calculate the digest over
     * @return a hexadecimal digest string
     */
    public static String md5Hex(final byte[] bytes) {
        return DigestUtils.md5DigestAsHex(bytes);
    }

    /**
     * 执行数据加密
     *
     * @param source 被加密的对象(通常是字符串对象)
     * @return 加密后的字符
     */
    public static String encryptForChar(String source) {
        String algorithm = securityProperty.getAlgorithm().value();
        return encryptWithAlgorithm(algorithm, source, securityProperty.getSalt(), securityProperty.getHashIterations());
    }

    /**
     * 使用指定的算法执行数据加密
     *
     * @param algorithmName  加密算法名称
     * @param source         被加密的对象(通常是字符串对象)
     * @param salt           参与加密算法的盐值
     * @param hashIterations hash加密次数
     * @return 加密后的字符
     */
    private static String encryptWithAlgorithm(String algorithmName, Object source, Object salt, int hashIterations) {
        return new SimpleHash(algorithmName, source, salt, hashIterations).toHex();
    }

}
